package com.learn.java3y.java.annotation;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class PersonTest {

    public static void main(String[] args) {
        try {
            // 使用内省【后边需要得到属性的写方法】，得到想要注入的属性
            PropertyDescriptor descriptor = new PropertyDescriptor("person", PersonDao.class);
            // 得到要想注入属性的具体对象
            Person person = (Person) descriptor.getPropertyType().newInstance();
            // 得到该属性的写方法【setPerson()】
            Method method = descriptor.getWriteMethod();
            // 得到写方法的注解
            Annotation annotation = method.getAnnotation(InjectPerson.class);
            // 得到注解上的信息【注解的成员变量就是用方法来定义的】
            Method[] methods = annotation.getClass().getMethods();
            // 将注解上的信息填充到person对象上
            for (Method m : methods) {
                //得到注解上属性的名字【age或name】
                String name = m.getName();
                // 看看Person对象有没有与之对应的方法【setAge(),setName()】
                try {
                    PropertyDescriptor descriptor1 = new PropertyDescriptor(name, Person.class);
                    Method method1 = descriptor1.getWriteMethod(); // setAge(), setName()
                    Object o = m.invoke(annotation, null);
                    method1.invoke(person, o);
                } catch (Exception e) {
                    continue;
                }
            }

            PersonDao personDao = new PersonDao();
            method.invoke(personDao, person);
            System.out.println(personDao.getPerson().getUsername());
            System.out.println(personDao.getPerson().getAge());

        } catch (IntrospectionException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
